package com.cyf.filmDownload.common.util;


public class HexUtil {
    /**
     * 字节数组转换十六进制字符串
     * @param bytes 字节数组
     * @return
     */
    public static String bytesTohex(byte[] bytes) {
        StringBuilder builder = new StringBuilder();
        for (byte element : bytes) {
            // 0xFF 256
            String hex = Integer.toHexString(element & 0XFF).toUpperCase();
            if (hex.length() == 1) {
                builder.append("0");
            }
            builder.append(hex);
        }
        return builder.toString();
    }

    /**
     * 十六进制字符串转换为字节数组
     * @param hexStr 16进制字符串
     * @return
     */
    public static byte[] hexTobytes(String hexStr) {
        if (hexStr.length() % 2 == 1) {
            hexStr = "0" + hexStr;
        }
        int count = hexStr.length() / 2;
        byte[] ret = new byte[count];
        for (int i = 0; i < count; i++) {
            int index = i * 2;
            char c1 = hexStr.charAt(index);
            char c2 = hexStr.charAt(index + 1);
            // 将第一个十六进制字符转换为对应的字节值（0-15），并左移4位
            ret[i] = (byte) (toByte(c1) << 4);
            // 将第二个十六进制字符转换为对应的字节值（0-15），并与前面左移后的结果进行按位或操作
            // 这样就可以将两个十六进制字符合并成一个字节
            ret[i] = (byte) (ret[i] | toByte(c2));
        }
        return ret;
    }

    private static byte toByte(char src) {
        switch (Character.toUpperCase(src)) {
            case '0':
                return 0x0;
            case '1':
                return 0x1;
            case '2':
                return 0x2;
            case '3':
                return 0x3;
            case '4':
                return 0x4;
            case '5':
                return 0x5;
            case '6':
                return 0x6;
            case '7':
                return 0x7;
            case '8':
                return 0x8;
            case '9':
                return 0x9;
            case 'A':
                return 0xA;
            case 'B':
                return 0xB;
            case 'C':
                return 0xC;
            case 'D':
                return 0xD;
            case 'E':
                return 0xE;
            case 'F':
                return 0xF;
            default:
                throw new IllegalStateException("0-F");
        }
    }
}
